package com.example.demo.config.wx.miniapp;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.example.demo.config.wx.miniapp.WxMaProperties;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxRuntimeException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;
import java.util.stream.Collectors;

/*
 * @Author:大力王
 * @Date:2024/5/30-30-23:44
 * 开始了
 */
@Slf4j
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
    private final WxMaProperties properties;

    @Autowired
    public WxMaConfiguration(@Qualifier("wxMaProperties") WxMaProperties properties) {
        this.properties = properties;
    }

/**
 * 创建并配置WxMaService实例。
 * 该方法会从yml中读取配置信息，然后初始化一个WxMaService实例，并设置其配置。
 * 如果未在yml中找到配置，将抛出WxRuntimeException异常。
 *
 * @return 配置好的WxMaService实例
 * @throws WxRuntimeException 如果未配置或配置错误，则抛出异常
 */
@Bean
public WxMaService wxMaService() {
    // 尝试从properties获取配置列表
    List<WxMaProperties.Config> configs = this.properties.getConfigs();
    log.info("configs: " + configs);
    // 如果配置为空，则抛出异常提示用户检查配置
    if (configs == null) {
        throw new WxRuntimeException("配置问题，注意别配错了！");
    }
    // 创建WxMaService的实现实例
    WxMaService maService = new WxMaServiceImpl();
    // 遍历配置列表，创建并设置多个配置到maService
    maService.setMultiConfigs(
            configs.stream()
                    .map(a -> {
                        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
                        // 初始化配置项
                        config.setAppid(a.getAppid());
                        config.setSecret(a.getSecret());
                        config.setToken(a.getToken());
                        config.setAesKey(a.getAeskey());
                        config.setMsgDataFormat(a.getMsgdataformat());
                        return config;
                    }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o)));
    return maService;
    }
}
